﻿using System;
using System.Web;
using System.Threading;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;
using System.Collections.Generic;
using Microsoft.Win32;

namespace jlynet.core.Library
{
    /// <summary>
    /// 系统操作相关的公共类
    /// </summary>    
    public static class SysHelper
    {
        #region 获取文件相对路径映射的物理路径
        /// <summary>
        /// 获取文件相对路径映射的物理路径
        /// </summary>
        /// <param name="virtualPath">文件的相对路径</param>        
        public static string GetPath(string virtualPath)
        {

            return HttpContext.Current.Server.MapPath(virtualPath);

        }
        #endregion

        #region 获取指定调用层级的方法名
        /// <summary>
        /// 获取指定调用层级的方法名
        /// </summary>
        /// <param name="level">调用的层数</param>        
        public static string GetMethodName(int level)
        {
            //创建一个堆栈跟踪
            StackTrace trace = new StackTrace();

            //获取指定调用层级的方法名
            return trace.GetFrame(level).GetMethod().Name;
        }
        #endregion

        #region 获取GUID值
        /// <summary>
        /// 获取GUID值
        /// </summary>
        public static string NewGUID
        {
            get
            {
                return Guid.NewGuid().ToString();
            }
        }
        #endregion

        #region 获取换行字符
        /// <summary>
        /// 获取换行字符
        /// </summary>
        public static string NewLine
        {
            get
            {
                return Environment.NewLine;
            }
        }
        #endregion

        #region 获取当前应用程序域
        /// <summary>
        /// 获取当前应用程序域
        /// </summary>
        public static AppDomain CurrentAppDomain
        {
            get
            {
                return Thread.GetDomain();
            }
        }
        #endregion

        #region 可获得当前执行的exe的文件名
        /// <summary>
        /// 可获得当前执行的exe的文件名
        /// </summary>
        /// <returns></returns>
        public static string GetMainFileName()
        {
            return Process.GetCurrentProcess().MainModule.FileName;
        }
        #endregion

        #region 获取和设置当前目录（即该进程从中启动的目录）的完全限定路径。
        /// <summary>
        /// 获取和设置当前目录（即该进程从中启动的目录）的完全限定路径。
        /// (备注:按照定义，如果该进程在本地或网络驱动器的根目录中启动，
        /// 则此属性的值为驱动器名称后跟一个尾部反斜杠（如“C:\”）。
        /// 如果该进程在子目录中启动，则此属性的值为不带尾部反斜杠的驱动器和
        /// 子目录路径[如“C:\mySubDirectory”])。 
        /// </summary>
        /// <returns></returns>
        public static string GetCurrentDirectorye()
        {
            return Environment.CurrentDirectory;
        }
        #endregion

        #region 获取应用程序的当前工作目录
        /// <summary>
        /// 获取应用程序的当前工作目录
        /// </summary>
        /// <returns></returns>
        public static string GetCurrentDirectory()
        {
            return Directory.GetCurrentDirectory();
        }
        #endregion

        #region 获取基目录，它由程序集冲突解决程序用来探测程序集。
        /// <summary>
        /// 获取基目录，它由程序集冲突解决程序用来探测程序集。
        /// </summary>
        /// <returns></returns>
        public static string GetBaseDirectory()
        {
            return AppDomain.CurrentDomain.BaseDirectory;
        }
        #endregion

        #region 获取启动了应用程序的可执行文件的路径，不包括可执行文件的名称。
        /// <summary>
        /// 获取启动了应用程序的可执行文件的路径，不包括可执行文件的名称。
        /// </summary>
        /// <returns></returns>
        public static string GetStartupPath()
        {
            return Application.StartupPath;
        }
        #endregion

        #region 获取启动了应用程序的可执行文件的路径，包括可执行文件的名称。 
        /// <summary>
        /// 获取启动了应用程序的可执行文件的路径，包括可执行文件的名称。
        /// </summary>
        /// <returns></returns>
        public static string GetExecutablePath()
        {
            return Application.ExecutablePath;
        }
        #endregion

        #region 获取或设置包含该应用程序的目录的名称。
        /// <summary>
        /// 获取或设置包含该应用程序的目录的名称。
        /// </summary>
        /// <returns></returns>
        public static string GetApplicationBase()
        {
            return AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
        }
        #endregion


        #region 获取指定系统环境变量的值
        /// <summary>
        /// 获取指定系统环境变量的值
        /// </summary>
        /// <param name="pathName"></param>
        /// <returns></returns>
        public static string GetEnvironmentVariable(string pathName)
        {
            return Environment.GetEnvironmentVariable(pathName);
        }
        #endregion

        #region 设置系统环境变量
        /// <summary>
        /// 设置系统环境变量
        /// </summary>
        /// <param name="pathName"></param>
        /// <returns></returns>
        public static void SetEnvironmentVariable(Dictionary<string, string> dic)
        {
            foreach (KeyValuePair<string, string> kvp in dic)
            {
                Environment.SetEnvironmentVariable(kvp.Key, kvp.Value);
            }
        }
        #endregion

        #region 注册表操作
        /// <summary>
        /// 关联文件
        /// </summary>
        /// <param name="_FilePathString">应用程序路径</param>
        /// <param name="p_FileTypeName">文件类型</param>
        public static void SaveReg(string _FilePathString, string p_FileTypeName)
        {
            RegistryKey _RegKey = Registry.ClassesRoot.OpenSubKey("", true);              //打开注册表
            RegistryKey _VRPkey = _RegKey.OpenSubKey(p_FileTypeName, true);
            if (_VRPkey != null)
            {
                _RegKey.DeleteSubKey(p_FileTypeName, true);
            }
            _RegKey.CreateSubKey(p_FileTypeName);
            _VRPkey = _RegKey.OpenSubKey(p_FileTypeName, true);
            _VRPkey.SetValue("", "Exec");
            _VRPkey = _RegKey.OpenSubKey("Exec", true);
            if (_VRPkey != null) _RegKey.DeleteSubKeyTree("Exec");         //如果等于空就删除注册表DSKJIVR
            _RegKey.CreateSubKey("Exec");
            _VRPkey = _RegKey.OpenSubKey("Exec", true);
            _VRPkey.CreateSubKey("shell");
            _VRPkey = _VRPkey.OpenSubKey("shell", true);                      //写入必须路径
            _VRPkey.CreateSubKey("open");
            _VRPkey = _VRPkey.OpenSubKey("open", true);
            _VRPkey.CreateSubKey("command");
            _VRPkey = _VRPkey.OpenSubKey("command", true);
            string _PathString = "\"" + _FilePathString + "\" \"%1\"";
            _VRPkey.SetValue("", _PathString);                                    //写入数据
        }

        /// <summary>
        /// 取消文件关联
        /// </summary>
        /// <param name="p_FileTypeName">文件类型</param>
        public static void DelReg(string p_FileTypeName)
        {
            RegistryKey _Regkey = Registry.ClassesRoot.OpenSubKey("", true);
            RegistryKey _VRPkey = _Regkey.OpenSubKey(p_FileTypeName);
            if (_VRPkey != null)
            {
                _Regkey.DeleteSubKey(p_FileTypeName, true);
            }
            if (_VRPkey != null)
            {
                _Regkey.DeleteSubKeyTree("Exec");
            }
        }

        internal static string GetRandomString(int v1, string v2)
        {
            byte[] b = new byte[4];
            new System.Security.Cryptography.RNGCryptoServiceProvider().GetBytes(b);
            Random r = new Random(BitConverter.ToInt32(b, 0));
            string s = null, str = "";
            str += "0123456789";
            str += "abcdefghijklmnopqrstuvwxyz";
            str += "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            str += v2;
            for (int i = 0; i < v1; i++){
                s += str.Substring(r.Next(0, str.Length - 1), 1);
            }
            return s;
        }
        #endregion

    }
}
